package com.Stream;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;

/**
 * Stream流的常用API
 */

public class StreamDemo3 {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        Collections.addAll(list,"张无忌","李元芳","张三丰","张毅","张三丰");
        System.out.println(list);
        //[张无忌, 李元芳, 张三丰, 张毅, 张三丰]


        /**
         * 1.过滤方法：filter
         */
//        list.stream().filter(new Predicate<String>() {
//            @Override
//            public boolean test(String s) {
//                return s.startsWith("张");
//            }
//        });

        //简化
        //流是不能直接输出的，只能通过遍历输出，而且改变流里面的数据，原来集合里面的数据是不会改变的
        list.stream().filter(s -> s.startsWith("张")).forEach(s-> System.out.println(s));
        //张无忌、张三丰、张毅、张三丰
        System.out.println(list);
        //[张无忌, 李元芳, 张三丰, 张毅, 张三丰]


        /**
         * 2.limit方法：获取流数据的前几个数据
         */
        Stream<String> limit = list.stream().limit(3);
//        limit.forEach(s-> System.out.println(s));
        limit.forEach(System.out::println);
        //张无忌
        //李元芳
        //张三丰

        /**
         * 3.skip:跳过前几个元素
         */
        list.stream().skip(3).forEach(System.out::println);
        //张毅
        //张三丰


        /**
         * 4.取出流中的相同对象
         */
        list.stream().distinct().forEach(s-> System.out.println(s));
        //张无忌
        //李元芳
        //张三丰
        //张毅

        /**
         * 5.maa方法：对流数据中的每个数据进行加工
         */
        //第一个参数是加工前的类型，第二个是加工后的结果类型
//        list.stream().map(new Function<String, String>() {
//            @Override
//            public String apply(String s) {
//                //在每个字符串后面加上heima
//                return s+"heima";
//            }
//        });

        //简化
        Stream<String> stringStream = list.stream().map(s -> s + "heima");
        stringStream.forEach(s-> System.out.println(s));
        //张无忌heima李元芳heima张三丰heima张毅heima张三丰heima


        /**
         * 6.合并流方法concat
         */
        Stream<String> zhang = list.stream().filter(s -> s.startsWith("张"));
        Stream<String> java = Stream.of("java", "python");
        Stream<String> concat = Stream.concat(java, zhang);
        concat.forEach(System.out::println);
        //java
        //python
        //张无忌
        //张三丰
        //张毅
        //张三丰
    }
}
